package servlets;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import EJBPackage.Abilita;
import EJBPackage.Utente;
import ejbSessions.ManagerAbilitaRemote;
import ejbSessions.ManagerUtenteRemote;

/**
 * Servlet implementation class UtentiRicercati
 */
public class UtentiRicercati extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UtentiRicercati() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		gestisciRichiesta(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		gestisciRichiesta(request, response);
	}

	private void gestisciRichiesta(HttpServletRequest request, HttpServletResponse response){
		
		RequestDispatcher dispatcher = request.getRequestDispatcher("/UtentiRicercati.jsp");
		HttpSession session = request.getSession();
		boolean redirect = false;
		try{
			Hashtable<String,String> env = new Hashtable<String,String>();
			env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
			env.put(Context.PROVIDER_URL,"localhost:1099");
			InitialContext jndiContext = new InitialContext(env);
			Object ref = jndiContext.lookup("ManagerUtente/remote");
			ManagerUtenteRemote manager = (ManagerUtenteRemote)ref;
			Object ref2 = jndiContext.lookup("ManagerAbilita/remote");
			ManagerAbilitaRemote managerAbilita = (ManagerAbilitaRemote)ref2;

			Object idUtenteLoggatoObj = session.getAttribute("userid");
			int amici = Integer.parseInt(request.getParameter("amici"));
			
			String[] ckbxAbilita =  request.getParameterValues("ckbxAbilita");
			if(ckbxAbilita!=null && ckbxAbilita.length<1){
				response.sendRedirect("./Amici");
			}else{
				List<Abilita> abilita = new ArrayList<Abilita>();
				Set<Utente> utentiTrovati = null;
				boolean first = true;
				String listaAbilita = "";
				for(String s: ckbxAbilita){
					Abilita a = managerAbilita.getAbilita(Integer.parseInt(s));
					listaAbilita+=a.getNome()+" ";
					if(first){
						Set<Utente> tmpUtenti = a.getUtenti();
						utentiTrovati = new HashSet<Utente>(tmpUtenti);
						first = false;
					}else{
						Set<Utente> tmpUtenti = a.getUtenti();
						List<Utente> daRimuovere = new ArrayList<Utente>();
						Iterator<Utente> cercaUtente = utentiTrovati.iterator();
						Set<Utente> tmpUtentiTrovati = new HashSet<Utente>();
						while(cercaUtente.hasNext()){
							Utente uTmp = cercaUtente.next();
							Iterator<Utente> utentiAbilita = tmpUtenti.iterator();
							while(utentiAbilita.hasNext()){
								Utente uScansione = utentiAbilita.next();
								if(uScansione.getId() == uTmp.getId()){
									tmpUtentiTrovati.add(uTmp);
								}
							}						
						}
	
						utentiTrovati = new HashSet<Utente>(tmpUtentiTrovati);
						
					}
				}
				if(utentiTrovati!=null && idUtenteLoggatoObj!=null){
					int idUtenteLoggato = (Integer) idUtenteLoggatoObj;
					Iterator<Utente> itUtentiTrovati = utentiTrovati.iterator();
					Set<Utente> tmpUtentiTrovati = new HashSet<Utente>();
					while(itUtentiTrovati.hasNext()){
						Utente tmpUtente = itUtentiTrovati.next();
						boolean isAmico = isAmico(manager.getAmici(idUtenteLoggato), tmpUtente.getId());
						if(tmpUtente.getId()!=idUtenteLoggato && ((isAmico && amici==1) || amici==0)){
							tmpUtentiTrovati.add(tmpUtente);
						}
					}
					utentiTrovati = new HashSet<Utente>(tmpUtentiTrovati);
				}
				
				session.setAttribute("abilitaString",listaAbilita);
				session.setAttribute("listaUtenti", utentiTrovati);
			}
			
		}catch(Exception e){
			e.printStackTrace();
			try {
				redirect=true;
				response.sendRedirect("./");
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		
		try {
			if(!redirect){
				dispatcher.forward(request, response);
			}
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}
	
	private boolean isAmico(Set<Utente> amici, int idAmico){
		Iterator<Utente> iAmici = amici.iterator();
		while(iAmici.hasNext()){
			Utente amico = iAmici.next();
			if(amico.getId()==idAmico){
				return true;
			}
		}
		return false;
	}
}
